//
//  HMStatusViewModel.swift
//  Weibo
//
//  Created by teacher on 2017/6/8.
//  Copyright © 2017年 teacher. All rights reserved.
//

import UIKit
import YYText

//  处理首页cell微博数据显示的逻辑
class HMStatusViewModel: NSObject {
    
    //  引用数据模型
    var status: HMStatus? {
        didSet {
            
            guard let currentStatus = status else {
                return
            }
            
            //  根据mbrank数据处理会员等级图片
            handleMbrankImage(mbrank: currentStatus.user?.mbrank ?? 0)
            //  根据认证类型等级处理显示的图片
            handleVerifiedTypeImage(verifiedType: currentStatus.user?.verified_type ?? -1)
            //  处理转发微博显示内容
            hanleRetweetContent(status: currentStatus)
            //  处理来源数据
            handleSourceContent(source: currentStatus.source ?? "")
            //  处理原创微博富文本
            originalAttributedText = handleAttributeText(text: currentStatus.text ?? "", isOriginal: true)
            
        }
    }
    //  MARK:+++++++++++++++++++++++++++++++++++++++++++
    //  会员等级图片
    var mbrankImage: UIImage?
    //  认证类型等级图片
    var verifiedTypeImage: UIImage?
    //  转发微博内容
    var retweetContent: String?
    //  来源内容
    var sourceContent: String?
    
    //  原创微博富文本
    var originalAttributedText: NSAttributedString?
    //  转发微博富文本
    var retweetAttributedText: NSAttributedString?
    
    //  处理微博内容转成富文本
    private func handleAttributeText(text: String, isOriginal: Bool) -> NSAttributedString {
        //  把微博内容转成富文本
        let attributedText = NSMutableAttributedString(string: text)
        
        //  匹配微博内容中的表情描述
        let regularExpression = try! NSRegularExpression(pattern: "\\[\\w+\\]", options: [])
        let matchResultArray = regularExpression.matches(in: text, options: [], range: NSMakeRange(0, (text as NSString).length))
        
        var fontSize: CGFloat = 14//   原创微博字体14
        //  原创微博默认颜色
        var color: UIColor = UIColor.darkGray
        if isOriginal == false {
            //  转发微博字体大小
            fontSize = 13
            //  转发微博颜色
            color = UIColor.lightGray
        }
        
        //  遍历匹配结果获取表情描述的范围
        //  需要匹配范围结果反转，那么这样匹配范围不会越界
        for matchResult in matchResultArray.reversed() {
            //  获取表情描述的范围
            let range = matchResult.range
            //  根据范围获取内容
            let chs = (text as NSString).substring(with: range)
            print(chs, NSStringFromRange(range))
           
            //  根据表情描述，查找对应的表情模型
            if let emoticon = HMEmoticonTools.sharedTools.searchEmoticonWithChs(chs: chs) {
                //  表示一定有表情模型
                let image = UIImage(named: emoticon.path!, in: EmoticonButton, compatibleWith: nil)!
                //  使用YYText 把图片转富文本
                 let emoticonAttributedText = NSAttributedString.yy_attachmentString(withEmojiImage: image, fontSize: fontSize)!
//                //  根据表情模型创建表情富文本
//                let emoticonAttributedText = NSAttributedString.attributedStringWithEmoticon(emoticon: emoticon, font: UIFont.systemFont(ofSize: fontSize))
                //  替换指定范围的表情富文本
                attributedText.replaceCharacters(in: range, with: emoticonAttributedText)
                
            }
            
        }
        
        //  统一设置富文本的字体大小和文字文字颜色
         attributedText.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: fontSize), NSForegroundColorAttributeName: color], range: NSMakeRange(0, attributedText.length))
//        if isOriginal {
//            //  原创微博
//            attributedText.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: fontSize), NSForegroundColorAttributeName: UIColor.darkGray], range: NSMakeRange(0, attributedText.length))
//        } else {
//            //  转发微博
//            attributedText.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: fontSize), NSForegroundColorAttributeName: UIColor.lightGray], range: NSMakeRange(0, attributedText.length))
//        }
        
        //  匹配高亮文字范围
        //  @xx:
        addHighlightedAttributedText(pattern: "@[^:]+", attributedText: attributedText)
        //  #xx#
        addHighlightedAttributedText(pattern: "#[^#]+#", attributedText: attributedText)
        //  http或者https
        addHighlightedAttributedText(pattern: "http[s]?://[^\\s\\u4e00-\\u9fa5]+", attributedText: attributedText)
        return attributedText
    }
    
    //  设置富文本高亮
    //  pattern: 高亮的匹配的正则表达式
    //  attributedText: 微博富文本
    func addHighlightedAttributedText(pattern: String, attributedText: NSMutableAttributedString) {
        //  使用正则匹配高亮文字
        let highlightedRegularExpression = try! NSRegularExpression(pattern: pattern, options: [])
        //  获取匹配结果
        let highlightedMatchResultArray = highlightedRegularExpression.matches(in: attributedText.string, options: [], range: NSMakeRange(0, (attributedText.string as NSString).length))
        //  遍历匹配结果获取高亮文字范围
        for highlightedMatchResult in highlightedMatchResultArray {
            //  高亮文字范围
            let highlightedRange = highlightedMatchResult.range
            //  高亮文字颜色
            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
            //  设置高亮范围对应富文本的颜色
            attributedText.addAttribute(NSForegroundColorAttributeName, value: color, range: highlightedRange)
            //  创建文本高亮对象
            let textHighlight = YYTextHighlight()
            //  高亮文字的背景色
            let bgColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
            //  创建文本边框对象
            let textBoarder = YYTextBorder(fill: bgColor, cornerRadius: 3)
            //  设置边框的内间距
            textBoarder.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
            //  设置高亮的背景边框颜色
            textHighlight.setBackgroundBorder(textBoarder)
            //  设置富文本的高亮文字的背景色，使用YYText的方法设置高亮
            attributedText.yy_setTextHighlight(textHighlight, range: highlightedRange)
            
        }

    
    }
    
    //  只读计算属性，每次使用都需要调用get方法，在get方法里面需要和当前时间进行判断，进行数据显示的处理
    var timeContent: String? {
        get {
            guard let createAt = status?.created_at else {
                return nil
            }
            //  代码执行时间对象一定有值
            let dt = DateFormatter()
            if isThisYear(createAt: createAt) {
                //  今年
                //  创建日历对象
                let calendar = Calendar.current
                if calendar.isDateInToday(createAt) {
                    //  今天
                    //  根据发微博的时间和当前时间计算时间差，结果是秒数，可以根据秒数进行判断
//                    createAt.timeIntervalSince(xx)
                    //  abs绝对值
                    let result = abs(createAt.timeIntervalSinceNow)
                    if result < 60 {
                        return "刚刚"
                    } else if result < 3600 {
                        let timeStr = result / 60
                        return "\(Int(timeStr))分钟前"
                    } else {
                        let timeStr = result / 3600
                        return "\(Int(timeStr))小时前"
                    }
                    
                    
                } else if calendar.isDateInYesterday(createAt) {
                    //  昨天
                    dt.dateFormat = "昨天 HH:mm"
                } else {
                    //  其它
                    dt.dateFormat = "MM-dd HH:mm"
                }
                
            } else {
                //  不是今年
                dt.dateFormat = "yyyy-MM-dd HH:mm"
            }
            return dt.string(from: createAt)
        }
    }
    
    //  判断是否是今年
    private func isThisYear(createAt: Date) -> Bool {
    
        let dt = DateFormatter()
        dt.dateFormat = "yyyy"
        //  获取发微博的年份
        let createAtYear = dt.string(from: createAt)
        //  获取当前时间的年份
        let currentYear = dt.string(from: Date())
        
        //  对比时间字符串是否相同
        return createAtYear == currentYear
    }
    
    //  处理来源数据
    private func handleSourceContent(source: String) {
        //  查找制定字符串的范围
        if let startRange = source.range(of: "\">"), let endRange = source.range(of: "</") {
            //  保证范围都能找到，获取指定范围的光标索引位置
            //  获取指定范围的最大光标索引位置
            let startIndex = startRange.upperBound
            //  获取指定范围的最小光标索引位置
            let endIndex = endRange.lowerBound
            //  根据范围获取字符串
            let result = source.substring(with: startIndex..<endIndex)
            sourceContent = "来自: " + result
        }
        
    }
    
    //  处理转发微博显示内容
    private func hanleRetweetContent(status: HMStatus) {
        if status.retweeted_status != nil {
            //  有转发微博
            //  转发人的名字,  转发微博内容
            if let name = status.retweeted_status?.user?.screen_name, let text = status.retweeted_status?.text {
                //   转发微博数据拼接
                retweetContent = "@\(name): \(text)"
                //  处理转发微博富文本内容
                retweetAttributedText = handleAttributeText(text: retweetContent!, isOriginal: false)
        }
    }
}
    
    //  根据认证类型等级处理显示的图片
    private func handleVerifiedTypeImage(verifiedType: Int) {
        switch verifiedType {
        case 0:
            verifiedTypeImage = UIImage(named: "avatar_vip")
        case 2, 3, 5:
            verifiedTypeImage = UIImage(named: "avatar_enterprise_vip")
        case 220:
            verifiedTypeImage = UIImage(named: "avatar_grassroot")
        default:
            verifiedTypeImage = nil
        }
    }
    
    //  根据mbrank数据处理会员等级图片
    private func handleMbrankImage(mbrank: Int) {
        if mbrank >= 1 && mbrank <= 6 {
            mbrankImage = UIImage(named: "common_icon_membership_level\(mbrank)")
        }
    }
    
}
